The different ways components actually pass information to each other.
Parent-to-child is the simple case — props, passed straight down. Child-to-parent has to go through a callback: the parent passes a function down as a prop, and the child calls it with whatever data it wants to send up. There's no direct sibling-to-sibling channel at all — the standard fix is lifting the shared state up to the closest common ancestor, so both siblings receive it (and a way to update it) as props from above.
As component trees grow deeper, the real cost isn't any single pattern — it's prop drilling, where a piece of state has to be threaded as props through several intermediate components that don't actually use it themselves, just to reach the one that does. That's the specific pain that pushes teams toward Context API or a state management library — though reaching for global state for something only two nearby components actually need is its own common overcorrection worth being able to argue against.
What you'll walk away knowing